import numpy as np
import cv2

x = np.uint8([250])
y = np.uint8([10])

# 图像加运算
# result [[255]]
print(cv2.add(x, y))  # 250+10 = 260 => 255

# result [4]
print(x+y)          # 250+10 = 260 % 256 = 4


# Image Blending图像混合
img1 = cv2.imread('test0.jpg')
img2 = cv2.imread('test1.jpg')

dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)

cv2.imwrite('blending.png', dst)

# Bitwise Operations 位运算
"""
This includes bitwise AND, OR, NOT and XOR operations. They will be highly useful while extracting 
any part of the image (as we will see in coming chapters), defining and working with non-rectangular ROI etc.
Below we will see an example on how to change a particular region of an image.

I want to put OpenCV logo above an image. If I add two images, it will change color.
If I blend it, I get an transparent effect. But I want it to be opaque. If it was a rectangular region, 
I could use ROI as we did in last chapter. But OpenCV logo is a not a rectangular shape.
"""
# Load two images
img1 = cv2.imread('test1.jpg')
img2 = cv2.imread('opencv-logo.png')
# I want to put logo on top-left corner, So I create a ROI
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols ]

# Now create a mask of logo and create its inverse mask also
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)

# Now black-out the area of logo in ROI
img1_bg = cv2.bitwise_and(roi, roi, mask = mask_inv)

# Take only region of logo from logo image.
img2_fg = cv2.bitwise_and(img2, img2, mask = mask)

# Put logo in ROI and modify the main image
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols ] = dst
cv2.imwrite('bit.png', img1)